﻿//#include<iostream>
//using namespace std;
//
//typedef int STDataType;
//class Stack
//{
//public:
//	Stack(int n = 4)
//	{
//		_a = (STDataType*)malloc(sizeof(STDataType)*n);
//		if (_a == nullptr)
//		{
//			perror("malloc fail");
//			return;
//		}
//		_capacity = n;
//		_top = 0;
//	}
//
//	//深拷贝,防止同一空间重复释放,需要开辟一块新空间给拷贝对象
//	Stack(const Stack& st)
//	{
//		_a = (STDataType*)malloc(sizeof(STDataType) * st._capacity);
//		if (_a == nullptr)
//		{
//			perror("malloc fail");
//			return;
//		}
//		//memcpy就是从一个地址复制到另一个地址
//		memcpy(_a, st._a, sizeof(STDataType) * st._top);
//		//_a = st._a;若这样则会在同一块地址,导致重复释放
//	}
//
//	void Push(STDataType x)
//	{
//		if (_top == _capacity)
//		{
//			int newcapacity = _capacity * 2;
//			STDataType* tmp = (STDataType*)realloc(_a, newcapacity *sizeof(STDataType));
//			if (tmp == NULL)
//			{
//				perror("realloc fail");
//				return;
//			}
//			_a = tmp;
//			_capacity = newcapacity;
//		}
//		_a[_top++] = x;	
//	}
//
//	~Stack()
//	{
//		cout << "~Stack()" << endl;
//		free(_a);
//		_a = nullptr;
//		_top = _capacity = 0;
//	}
//private:
//	STDataType*_a;
//	size_t _capacity;
//	size_t _top;
//};
//	
//// 两个Stack实现队列
//class MyQueue
//{
//public:
//private:
//	Stack pushst;
//	Stack popst;
//};
//
//int main()
//{
//	//Stack st1;
//	//st1.Push(1);
//	//st1.Push(2);
//	// Stack不显⽰实现拷⻉构造，⽤⾃动⽣成的拷⻉构造完成浅拷⻉
//	// 会导致st1和st2⾥⾯的_a指针指向同⼀块资源，析构时会析构两次，程序崩溃
//	/*Stack st2 = st1;*/
//	//Stack st2(st1); 两种写法相同
//
//	MyQueue mq1;
//	// MyQueue⾃动⽣成的拷⻉构造，会⾃动调⽤Stack拷⻉构造完成pushst/popst
//	// 的拷⻉，只要Stack拷⻉构造⾃⼰实现了深拷⻉，他就没问题
//	MyQueue mq2 = mq1;
//	return 0;
//}